gboolean sensitive)
{
GtkWidgetPrivate *priv;
- GtkStateData data;
g_return_if_fail (GTK_IS_WIDGET (widget));
if (priv->sensitive == sensitive)
return;
- data.flags = GTK_STATE_FLAG_INSENSITIVE;
-
- if (sensitive)
- {
- priv->sensitive = TRUE;
- data.operation = STATE_CHANGE_UNSET;
- }
- else
+ if (priv->parent == NULL
+ || gtk_widget_is_sensitive (priv->parent))
{
- priv->sensitive = FALSE;
- data.operation = STATE_CHANGE_SET;
- }
+ GtkStateData data;
- data.use_forall = TRUE;
+ data.flags = GTK_STATE_FLAG_INSENSITIVE;
- gtk_widget_propagate_state (widget, &data);
+ if (sensitive)
+ {
+ priv->sensitive = TRUE;
+ data.operation = STATE_CHANGE_UNSET;
+ }
+ else
+ {
+ priv->sensitive = FALSE;
+ data.operation = STATE_CHANGE_SET;
+ }
- gtk_widget_queue_resize (widget);
+ data.use_forall = TRUE;
+
+ gtk_widget_propagate_state (widget, &data);
+
+ gtk_widget_queue_resize (widget);
+ }
g_object_notify (G_OBJECT (widget), "sensitive");
}